import cflw代码库py.cflw网络地址 as 地址
import cflw代码库py.cflw字符串 as 字符串
import cflw代码库py.cflw工具_序列 as 序列
from ..基础接口 import 接口 as 北向接口
from ..基础接口 import 信息
from ..基础接口 import 数据表
from ..思科命令行 import 接口 as 思科接口
from ..思科命令行 import 基本表信息 as 思科基本表信息
#===============================================================================
# 接口表
#===============================================================================
class F交换接口表(数据表.I解析表格管线):
	"""show interface switchport brief
	适用于: 迈普sm4120(v6.6.4.1.3)"""
	c接口 = 0	#1
	c状态 = 18	#意义不明的列
	c连接 = 29
	c速率 = 35
	c双工 = 46
	vsl = 57	#意义不明的列
	c类型 = 66	#意义不明的列
	c虚拟局域网 = 75
	c描述 = 81
	ca列 = 序列.C切片组(c接口, c状态, c连接, c速率, c双工, vsl, c类型, c虚拟局域网, c描述)
	c标题行0 = " Interface        Status     Link  ActSpeed   ActDuplex  VSL      Type     Pvid  Desc"
	c标题行1 = " -----------------------------------------------------------------------------------------"
	def __init__(self):
		数据表.I解析表格管线.__init__(self)
		self.f添加字段(数据表.E字段.e本端接口, F交换接口表.ca列.F切片(0), 思科接口.f创建接口缩写)
		self.f添加字段(数据表.E字段.e本端链路状态, F交换接口表.ca列.F切片(2), 信息.f解析起宕状态)
		self.f添加字段(数据表.E字段.e本端速率, F交换接口表.ca列.F切片(3), lambda s: int(s) * 1000000 if s.isdigit() else None)
		self.f添加字段(数据表.E字段.e本端双工模式, F交换接口表.ca列.F切片(4), 信息.f解析双工模式)
		self.f添加字段(数据表.E字段.e本端虚拟局域网, F交换接口表.ca列.F切片(7), int)
		self.f添加字段(数据表.E字段.e本端描述, F交换接口表.ca列.F切片(8), str)
	f初始处理 = staticmethod(数据表.F去标题行(c标题行0, c标题行1))
	fi有效行 = staticmethod(数据表.F有效行长度(80))
f交换接口表 = F交换接口表()
#===============================================================================
# 网络接口表
#===============================================================================
def f解析网络地址4(a地址: str):
	if "unassigned" in a地址:
		return None
	return 地址.S网络地址4.fc地址前缀长度(a地址, 32)
class F网络接口表4(数据表.I解析表格管线):
	"""show ip interface brief
	适用于: 迈普sm4120(v6.6.4.1.3)"""
	c接口 = 0
	c地址 = 33
	c状态 = 49
	c协议 = 71
	c描述 = 80
	ca列 = 序列.C切片组(c接口, c地址, c状态, c协议, c描述)
	c标题行0 = "Interface                        IP-Address      Status                Protocol Description"
	def __init__(self):
		数据表.I解析表格管线.__init__(self)
		self.f添加字段(数据表.E字段.e本端接口, F网络接口表4.ca列.F切片(0), 思科接口.f创建接口)
		self.f添加字段(数据表.E字段.e本端网络地址4, F网络接口表4.ca列.F切片(1), f解析网络地址4)
		self.f添加字段(数据表.E字段.e本端链路状态, F网络接口表4.ca列.F切片(2), 信息.f解析起宕状态)
		self.f添加字段(数据表.E字段.e本端协议状态, F网络接口表4.ca列.F切片(3), 信息.f解析起宕状态)
		self.f添加字段(数据表.E字段.e本端描述, F交换接口表.ca列.F切片(5), str)
	f初始处理 = staticmethod(数据表.F去标题行(c标题行0))
	fi有效行 = staticmethod(数据表.F有效行长度(79))
f网络接口表4 = F网络接口表4()
#===============================================================================
# 地址解析表
#===============================================================================
class F地址解析表4(数据表.I解析表格管线):
	"""show arp
	适用于: 迈普sm4120(v6.6.4.1.3)"""
	c协议 = 0
	c网络地址 = 10
	c寿命 = 30
	c物理地址 = 40
	c类型 = 56
	c网络口 = 64
	c交换口 = 99
	ca列 = 序列.C切片组(c协议, c网络地址, c寿命, c物理地址, c类型, c网络口, c交换口)
	c标题行0 = "Protocol  Address             Age (min) Hardware Addr   Type    Interface                          Switchport          "
	def __init__(self):
		数据表.I解析表格管线.__init__(self)
		self.f添加字段(数据表.E字段.e对端网络地址4, F地址解析表4.ca列.F切片(1), 地址.S网络地址4.fc主机地址字符串)
		self.f添加字段(数据表.E字段.e本端寿命, F地址解析表4.ca列.F切片(2), lambda s: int(s) * 60)
		self.f添加字段(数据表.E字段.e对端物理地址, F地址解析表4.ca列.F切片(3), 地址.S物理地址.fc字符串)
		self.f添加字段(数据表.E字段.e本端接口, F地址解析表4.ca列.F切片(5), 思科接口.f创建接口)
	f初始处理 = staticmethod(数据表.F去标题行(c标题行0))
	@staticmethod
	def fi有效行(a行: str):
		if len(a行) < 100:
			return False
		if "-" in a行:
			return False	#自已
		if not "Internet" in a行:
			return False	#似乎协议总是"Internet"
		return True
f地址解析表4 = F地址解析表4()
#===============================================================================
# 物理地址表
#===============================================================================
class F物理地址表(数据表.I解析表格管线):
	"""show mac-address all
	适用于: 迈普sm4120(v6.6.4.1.3)"""
	c虚拟局域网 = 0	#1
	c物理地址 = 10
	c类型 = 28
	c接口 = 40
	c状态 = 64
	c标志 = 76
	ca列 = 序列.C切片组(c虚拟局域网, c物理地址, c类型, c接口, c状态, c标志)
	c标题行0 = " VLAN          MAC           TYPE          INTERFACE             STATE       FLAG "
	c标题行1 = " ----     --------------    -------     --------------------    --------    ------"
	def __init__(self):
		数据表.I解析表格管线.__init__(self)
		self.f添加字段(数据表.E字段.e本端虚拟局域网, F物理地址表.ca列.F切片(0), int)
		self.f添加字段(数据表.E字段.e对端物理地址, F物理地址表.ca列.F切片(1), 地址.S物理地址.fc字符串)
		self.f添加字段(数据表.E字段.e对端物理地址类型, F物理地址表.ca列.F切片(2), 信息.ca物理地址类型.get)
		self.f添加字段(数据表.E字段.e本端接口, F物理地址表.ca列.F切片(3), 思科接口.f创建接口缩写)
	f初始处理 = staticmethod(数据表.F去标题行(c标题行0, c标题行1))
	fi有效行 = staticmethod(数据表.F有效行长度(80))
f物理地址表 = F物理地址表()